
import logging
import os

def setup_logger(name, log_file='logs/app.log'):
    """
    创建一个日志记录器，输出到控制台和文件。

    :param name: 日志记录器名称
    :param log_file: 日志文件路径（相对于项目根目录）
    :return: 配置好的 logger
    """
    # 获取当前文件的绝对路径
    module_path = os.path.abspath(__file__)
    base_dir = os.path.dirname(module_path)  # utils/
    project_root = os.path.dirname(base_dir)  # gzai4_ml/

    # 使用传入的 log_file，但基于项目根目录
    full_log_path = os.path.join(project_root, log_file)

    # 确保日志目录存在
    os.makedirs(os.path.dirname(full_log_path), exist_ok=True)

    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    # 避免重复添加处理器
    if logger.handlers:
        return logger

    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)

    # 文件处理器
    file_handler = logging.FileHandler(full_log_path, mode='a', encoding='utf-8')
    file_handler.setLevel(logging.DEBUG)

    # 格式化器
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)

    # 添加处理器
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)

    return logger


# 测试
if __name__ == '__main__':
    logger = setup_logger('ai', 'logs/app.log')  # 或 'log/app.log'
    logger.debug("这是一个调试信息")
    logger.info("这是一个普通信息")
    logger.warning("这是一个警告")
    logger.error("这是一个错误")